package org.kgduyjj.toolkit;

import java.util.Collection;
import java.util.Map;

import org.kgduyjj.toolkit.util.StringUtils;

/**
 * 简单的断言工具
 * 
 * @author Kgduyjj
 *
 */
public class Asserts {
    /**
     * 统一构建异常类型
     * 
     * @param message
     * @return
     */
    protected static RuntimeException buildException(String message) {
        return new RuntimeException(message);
    }

    /**
     * 统一构建异常类型
     * 
     * @param messageTpl
     * @param params
     * @return
     */
    protected static RuntimeException buildException(String messageTpl, Object... params) {
        return buildException(StringUtils.format(messageTpl, params));
    }

    /**
     * 对象参数若为空 抛出异常
     * 
     * @param object
     * @param messageTpl
     * @param params
     */
    public static void notNull(Object object, String messageTpl, Object... params) {
        if (object == null) {
            throw buildException(messageTpl, params);
        }
    }

    /**
     * 对象参数若为空 抛出异常
     * 
     * @param object
     * @param message
     */
    public static void notNull(Object object, String message) {
        if (object == null) {
            throw buildException(message);
        }
    }

    /**
     * 数据集合为空 抛出异常
     * 
     * @param dataset
     * @param messageTpl
     * @param params
     */
    public static void notEmpty(Collection<?> dataset, String messageTpl, Object... params) {
        if (dataset == null || dataset.isEmpty()) {
            throw buildException(messageTpl, params);
        }
    }

    /**
     * 数据集合为空 抛出异常
     * 
     * @param dataset
     * @param message
     */
    public static void notEmpty(Collection<?> dataset, String message) {
        if (dataset == null || dataset.isEmpty()) {
            throw buildException(message);
        }
    }

    /**
     * Map集合为空 抛出异常
     * 
     * @param map
     * @param messageTpl
     * @param params
     */
    public static void notEmpty(Map<?, ?> map, String messageTpl, Object... params) {
        if (map == null || map.isEmpty()) {
            throw buildException(messageTpl, params);
        }
    }

    /**
     * Map集合为空 抛出异常
     * 
     * @param map
     * @param message
     */
    public static void notEmpty(Map<?, ?> map, String message) {
        if (map == null || map.isEmpty()) {
            throw buildException(message);
        }
    }

    /**
     * 断言是否为真，如果为 {@code false} 抛出异常
     * 
     * @param expression
     * @param messageTpl
     * @param params
     */
    public static void notTrue(boolean expression, String messageTpl, Object... params) {
        if (false == expression) {
            throw buildException(messageTpl, params);
        }
    }

    /**
     * 断言是否为真，如果为 {@code false} 抛出异常
     * 
     * @param expression
     * @param message
     */
    public static void notTrue(boolean expression, String message) {
        if (false == expression) {
            throw buildException(message);
        }
    }

    /**
     * 检查值是否在指定范围内，默认给出提示内容为 <b>[{}不在指定范围内[{},{}]</b>
     * 
     * @param value   值
     * @param min     最小值（包含）
     * @param max     最大值（包含）
     * @param message
     */
    public static Number checkRange(Number value, Number min, Number max, String message) {
        notNull(value, "当前值不存在");
        notNull(min, "最小值不存在");
        notNull(max, "最大值不存在");
        double valueDouble = value.doubleValue();
        double minDouble = min.doubleValue();
        double maxDouble = max.doubleValue();
        if (valueDouble < minDouble || valueDouble > maxDouble) {
            throw buildException(message);
        }
        return value;
    }

    /**
     * 检查值是否在指定范围内，默认给出提示内容为 <b>[{}不在指定范围内[{},{}]</b>
     * 
     * @param value      值
     * @param min        最小值（包含）
     * @param max        最大值（包含）
     * @param messageTpl
     * @param params
     */
    public static Number checkRange(Number value, Number min, Number max, String messageTpl, Object... params) {
        notNull(value, "当前值不存在");
        notNull(min, "最小值不存在");
        notNull(max, "最大值不存在");
        double valueDouble = value.doubleValue();
        double minDouble = min.doubleValue();
        double maxDouble = max.doubleValue();
        if (valueDouble < minDouble || valueDouble > maxDouble) {
            throw buildException(messageTpl, params);
        }
        return value;
    }

    /**
     * 检查值是否在指定范围内，默认给出提示内容为 <b>[{}不在指定范围内[{},{}]</b>
     * 
     * @param value 值
     * @param min   最小值（包含）
     * @param max   最大值（包含）
     */
    public static Number checkRange(Number value, Number min, Number max) {
        return checkRange(value, min, max, "{}不在指定范围内[{},{}]", value, min, max);
    }
}
